﻿using System.Collections.Generic;
using System.Linq;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Interfaces.Repositories;

namespace GigaSite.Domain.DAL.Repositories
{
    /// <summary>
    /// СУБД реализация репозитория вакансий
    /// </summary>
    public class VacanciesRepository: BaseRepository<Vacancy>, IVacanciesRepository
    {
        /// <summary>
        /// Стандартный конструктор
        /// </summary>
        /// <param name="dataContext">Контекст доступа к данным</param>
        public VacanciesRepository(GigaDataContext dataContext) : base(dataContext)
        {
        }

        /// <summary>
        /// Загружает указанную сущность по ее идентификатору
        /// </summary>
        /// <param name="id">Идентификатор сущности</param>
        /// <returns>Сущность с указанным идентификатором или Null</returns>
        public override Vacancy Load(long id)
        {
            return Find(v => v.Id == id);
        }

        /// <summary>
        /// Возвращает количество вакансий в категории и во всех ее вложенных подкатегориях
        /// </summary>
        /// <param name="category">Категория вакансий</param>
        /// <returns>Количество вакансий</returns>
        public int GetVacanciesCountInCategoryAndChildCategories(Category category)
        {
            // TODO: переделать на получение средством хранимо процедуры
            return GetVacanciesInCategoryAndChildCategories(category).Count();
        }

        /// <summary>
        /// возвращает коллекцию вакансий, находящихся в указанной категории а так же во всех дочерних подкатегориях
        /// </summary>
        /// <param name="category">Категория вакансей</param>
        /// <returns>Коллекция доменных вакансий</returns>
        public IEnumerable<Vacancy> GetVacanciesInCategoryAndChildCategories(Category category)
        {
            // TODO: заменить в будущем на хранимую процедуру из БД
            // Получаем список всех категорий
            IList<Category> allCategories = new List<Category>()
                                    {
                                        category
                                    };
            category.GetAllChildCategories(ref allCategories);

            // Выбираем все подкатегории из указанных категорий
            return from cat in allCategories
                   from vac in cat.Vacancies
                   select vac;
        }
    }
}